package co.edu.javeriana.monopoly.server.eventos;

import co.edu.javeriana.monopoly.server.modelo.Casilla;
import co.edu.javeriana.monopoly.server.modelo.Evento;
import co.edu.javeriana.monopoly.server.modelo.Grupo;
import co.edu.javeriana.monopoly.server.modelo.Jugada;
import co.edu.javeriana.monopoly.server.modelo.Jugador;
import co.edu.javeriana.monopoly.server.modelo.Monopoly;

import co.edu.javeriana.monopoly.server.modelo.MonopolyException;

import co.edu.javeriana.monopoly.server.modelo.Propiedad;

import java.rmi.RemoteException;

import java.util.Iterator;

public class Comprar extends Evento {
    public Comprar(Object[] objects) {
        super(objects);
    }

    public void ejecutar() throws MonopolyException {
    
        Monopoly m;
        try {
            m = Monopoly.getMonopoly();
        } catch (RemoteException e) {
            throw new MonopolyException("Error al trae el juego",e);
        }
        Jugador jugador = (Jugador) m.getTablero().getJugadores().get(getJugada().getJugador().getId());
        Casilla casillaactual = (Casilla)m.getTablero().getCasillas().get(new Integer(jugador.getCasilla().getPosicion()));
        Evento e = null;
        Jugada nextjugada = new Jugada();
        nextjugada.setJugador(jugador);
        nextjugada.setMonopoly(m);

        if ( casillaactual instanceof Propiedad ){
            
            if ( jugador.getSaldo() < ((Propiedad)casillaactual).getPrecio() ){
                throw new MonopolyException("El valor de la propiedad supera su saldo",new Exception());                
            }else{
                ((Propiedad)casillaactual).setPropietario(jugador);
                jugador.setSaldo(jugador.getSaldo() - ((Propiedad)casillaactual).getPrecio());
                jugador.getPropiedades().add((Propiedad)casillaactual);
                
                Grupo g = (Grupo)m.getTablero().getGrupos().get(((Propiedad)casillaactual).getGrupo().getId());
                Iterator ipropiedades = g.getPropiedades().iterator();
                boolean estaengrupo = false;
                while (ipropiedades.hasNext()){
                    Propiedad pgrupo =  (Propiedad)ipropiedades.next();
                    Iterator ipropiedadesjugador = jugador.getPropiedades().iterator();
                    estaengrupo = false;
                    while (ipropiedadesjugador.hasNext()){
                        Propiedad pjugador =  (Propiedad)ipropiedadesjugador.next();
                        if (pgrupo.getId() == pjugador.getId()){
                            estaengrupo = true;
                            break;
                        }
                    }
                    if (!estaengrupo){
                        break;
                    }
                }
                if (estaengrupo){
                    while (ipropiedades.hasNext()){
                        Propiedad pgrupo =  (Propiedad)ipropiedades.next();
                        Iterator ipropiedadesjugador = jugador.getPropiedades().iterator();
                        while (ipropiedadesjugador.hasNext()){
                            Propiedad pjugador =  (Propiedad)ipropiedadesjugador.next();
                            if (pgrupo.getId() == pjugador.getId()){
                                pjugador.setDuenoGrupo(true);
                                break;
                            }
                        }
                    }
                }
                
            }
            if (jugador.getDado().sonPares()){
                e = new ResultadoPares(null);
            }else{
                e = new FinTurno(null);
            }
            nextjugada.setRegla(e);
        }else{
            throw new MonopolyException("Lo que intenta comprar no es propiedad",new Exception());
        }
        
        if (jugador.getDado().sonPares()){
            e = new ResultadoPares(null);
        }else{
            e = new FinTurno(null);
        }
        nextjugada.setRegla(e);
        try {
            m.enviarNotificacion(nextjugada);
        } catch (RemoteException f) {
             throw new MonopolyException("Error al notificar el proximo evento",f);
        }

    }

}
